home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtstacks.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  5.3 KB  |  167 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtStacks;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*)
  29.  
  30.  
  31.  
  32. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  33. (*                                              *)
  34. (*$R-   Range-Checks                            *)
  35. (*$S-   Stack-Check                             *)
  36. (*                                              *)
  37. (*----------------------------------------------*)
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  45.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  46.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  47.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  48.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  49.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  50.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  51.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  61.  
  62.  
  63.  
  64.  
  65. FROM SYSTEM     IMPORT  ADDRESS, ADR, TSIZE;
  66.  
  67. CONST   cMax =          07FFFH;
  68.  
  69. TYPE    INFO =          POINTER TO ARRAY [0..cMax] OF LOC;
  70.  
  71. TYPE    ENTRY =         POINTER TO Entry;
  72.         Entry =         RECORD
  73.                          addr: INFO;
  74.                          size: CARDINAL;
  75.                          next: ENTRY;
  76.                         END;
  77.  
  78. TYPE    STACK =         POINTER TO Stack;
  79.         Stack =         RECORD
  80.                          start: ENTRY;
  81.                          entry: lCARDINAL;
  82.                         END;
  83.  
  84. PROCEDURE Copy (from, to: INFO; size: CARDINAL);
  85. VAR c: CARDINAL;
  86. BEGIN
  87.  FOR c:= 0 TO size DO to^[c]:= from^[c]; END;
  88. END Copy;
  89.  
  90. PROCEDURE NewStack (VAR stack: STACK): BOOLEAN;
  91. BEGIN
  92.  ALLOCATE (stack,  TSIZE(Stack));  
  93.  IF stack = NIL THEN RETURN FALSE; END;
  94.  stack^.start:= NIL;
  95.  stack^.entry:= LONG (0);
  96.  RETURN TRUE;
  97. END NewStack;
  98.  
  99. PROCEDURE DisposeStack (VAR stack: STACK);
  100. VAR p: ENTRY;
  101. BEGIN
  102.  IF stack # NIL THEN
  103.   WITH stack^ DO
  104.    WHILE start # NIL DO
  105.     p:= start^.next;
  106.     DEALLOCATE (start^.addr, 0);  
  107.     DEALLOCATE (start, 0);  
  108.     start:= p;
  109.    END;
  110.   END;
  111.   DEALLOCATE (stack, 0);  
  112.  END;
  113.  stack:= NIL;
  114. END DisposeStack;
  115.  
  116. PROCEDURE StackEmpty (stack: STACK): BOOLEAN;
  117. BEGIN
  118.  IF stack = NIL THEN  RETURN TRUE;  END;
  119.  RETURN stack^.start = NIL;
  120. END StackEmpty;
  121.  
  122. PROCEDURE StackEntries (stack: STACK): lCARDINAL;
  123. BEGIN
  124.  IF stack = NIL THEN  RETURN LONG (0);
  125.                 ELSE  RETURN stack^.entry;
  126.  END;
  127. END StackEntries;
  128.  
  129. PROCEDURE Push (stack: STACK; info: ARRAY OF LOC): BOOLEAN;
  130. VAR p: ENTRY;
  131. BEGIN
  132.  IF stack = NIL THEN  RETURN FALSE;  END;
  133.  ALLOCATE (p,  TSIZE(Entry));  
  134.  IF p = NIL THEN  RETURN FALSE;  END;
  135.  p^.size:= HIGH (info);
  136.  ALLOCATE (p^.addr,  LONG(p^.size));  
  137.  IF p^.addr = NIL THEN  RETURN FALSE;  END;
  138.  Copy (ADR(info), p^.addr, p^.size);
  139.  p^.next:= stack^.start;
  140.  stack^.start:= p;
  141.  INC (stack^.entry);
  142.  RETURN TRUE;
  143. END Push;
  144.  
  145. PROCEDURE Pop (stack: STACK; VAR info: ARRAY OF LOC): BOOLEAN;
  146. VAR p: ENTRY;
  147. BEGIN
  148.  IF stack = NIL THEN  RETURN FALSE;  END;
  149.  WITH stack^ DO
  150.   IF start = NIL THEN
  151.    RETURN FALSE;
  152.   ELSE
  153.    IF HIGH(info) < start^.size THEN  RETURN FALSE;  END;
  154.    Copy (start^.addr, ADR(info), start^.size);
  155.    p:= start^.next;
  156.    DEALLOCATE (start^.addr, 0);  
  157.    DEALLOCATE (start, 0);  
  158.    start:= p;
  159.   END;
  160.  END;
  161.  DEC (stack^.entry);
  162.  RETURN TRUE;
  163. END Pop;
  164.  
  165. END mtStacks.
  166.  
  167.